# from PySide2.QtCharts import QBarSet, QBarSeries, QChart, QBarCategoryAxis, QValueAxis, QChartView, QAbstractBarSeries
from PySide2.QtCore import Qt
from PySide2.QtCharts import QtCharts
from PySide2.QtGui import QPainter, QFont, QColor
from PySide2.QtWidgets import QWidget




class Charts_Tools:

    """
    图标工具类
    """

    @staticmethod
    def draw_bar_one(draw_bar_config_dir={
        "title": "",
        "barset": [],
        "datas": [],
        "selected": [],
        "x_data": [],
        "y_data": [0, 40],
        "click_fun":None
    }) -> QWidget:
        """
        绘制单个组装图
        :param draw_bar_config_dir: 柱状图配置对象
        :return: 图表对象
        """

        # 条件过滤
        if not draw_bar_config_dir or draw_bar_config_dir is None:
            raise ValueError("参数传入有误")
        elif len(draw_bar_config_dir.get('barset')) == 0 or len(draw_bar_config_dir.get('datas')) == 0 or len(draw_bar_config_dir.get('x_data')) == 0:
            raise ValueError("参数配置有误")


        # 图例组合
        bars = []
        for bar_set in draw_bar_config_dir.get('barset'):
            bars.append(QtCharts.QBarSet(bar_set))

        if draw_bar_config_dir.get('click_fun') is not None:
            bars[0].clicked.connect(draw_bar_config_dir.get('click_fun'))
        # 图例数据添加
        index = 0
        for data in draw_bar_config_dir.get('datas'):
            bars[index].append(data)
            index += 1
        # bars[0].selectBars(draw_bar_config_dir.get('selected'))
        # bars[0].setSelectedColor("red")
        bars[0].setLabelColor(QColor("red"))
        # 用于管理所有的QBarSet对象
        series = QtCharts.QBarSeries()
        # 创建的QBarSet对象添加到QBarSeries中
        for bar in bars:
            series.append(bar)
        # 设置每个柱状图显示对应的值
        series.setLabelsVisible(True)
        # 顶部显示
        series.setLabelsPosition(QtCharts.QAbstractBarSeries.LabelsInsideEnd)


        # 创建一个QChart对象，用于绘制柱状图。
        chart = QtCharts.QChart()

        # 将QBarSeries添加到QChart中，以便在图表中显示。
        chart.addSeries(series)

        # 设置图表的标题。
        chart.setTitle(draw_bar_config_dir.get('title'))
        # 启用图表的动画效果（例如，在添加或更新数据时的动画）。
        chart.setAnimationOptions(QtCharts.QChart.SeriesAnimations)

        # 创建一个QBarCategoryAxis对象，用于表示X轴上的分类。
        categories = draw_bar_config_dir.get('x_data')
        axis_x = QtCharts.QBarCategoryAxis()
        axis_x.append(categories)
        # font = QFont()
        # font.setPointSize(12)
        # axis_x.setLabelsFont(font)

        # 将X轴添加到图表中，并设置其对齐方式为底部。
        chart.addAxis(axis_x, Qt.AlignBottom)

        # 将QBarSeries与X轴关联起来，以便柱状图能够正确地显示在X轴上的相应位置。
        series.attachAxis(axis_x)

        # 创建一个QValueAxis对象，用于表示Y轴上的值（数量）。
        axis_y = QtCharts.QValueAxis()
        axis_y.setRange(draw_bar_config_dir.get('y_data')[0], draw_bar_config_dir.get('y_data')[1])  # 设置Y轴的范围从0到15。

        # 将Y轴添加到图表中，并设置其对齐方式为左侧。
        chart.addAxis(axis_y, Qt.AlignLeft)

        # 将QBarSeries与Y轴关联起来，以便柱状图的高度能够正确地根据Y轴上的值进行缩放。
        # 注意：在Qt Charts中，柱状图的Y轴关联通常是自动的，这行代码可能是多余的，除非你有特殊的设置需求。
        series.attachAxis(axis_y)

        # 显示图例，并设置其对齐方式为底部。
        chart.legend().setVisible(True)
        chart.legend().setAlignment(Qt.AlignBottom)

        # 创建一个QChartView对象，用于在窗口中显示图表。
        _chart_view = QtCharts.QChartView(chart)
        _chart_view.setBaseSize(120,120)

        # 设置渲染提示以启用抗锯齿，使图表看起来更平滑。
        _chart_view.setRenderHint(QPainter.Antialiasing)

        return _chart_view
